---
title: "Windows上的Git服务器"
date: 2020-4-4
categories:
- windows
tags:
---

<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgb467ba7">使用Widnows10自带的OpenSSH和Git For Windows</a>
<ul>
<li><a href="#orgce49fee">安装Git for Windows</a></li>
<li><a href="#orgec87a3d">Windows10 开启OpenSSH功能</a></li>
<li><a href="#org6c04da2">Clone Windows上的仓库</a>
<ul>
<li><a href="#org2b862f6">最简单的办法是把Windows上OpenSSH的Login Shell改成bash，这样直接使用linux的路径格式。</a></li>
<li><a href="#org849cc90">如果不改Login Shell，也有解决方法</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-orgb467ba7">
<h2 id="orgb467ba7">使用Widnows10自带的OpenSSH和Git For Windows</h2>
<div class="outline-text-2" id="text-orgb467ba7">
<p>
在Linux环境下，搭建一个简单的Git服务器，只需要SSH服务就行了。<a href="https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%90%AD%E5%BB%BA-Git">具体的做法</a>
</p>
<ol class="org-ol">
<li>systemctl start sshd</li>
<li>服务器上放仓库，假设将一个仓库放在 /home/gdme1320/repo.git，服务器的IP是192.168.1.103</li>
<li>在客户机上 git clone gdme1320@192.168.1.103:/home/gdme1320/repo.git，就能开始使用了</li>
</ol>
<p>
Windows10中新添加了OpenSSH功能，那么在Windows10上也能使用上面的部署方法了。
</p>
</div>
<div class="outline-3" id="outline-container-orgce49fee">
<h3 id="orgce49fee">安装Git for Windows</h3>
<div class="outline-text-3" id="text-orgce49fee">
<p>
安装完成后需要检查环境变量，看看git(C:\Program Files\Git\bin) git-receive-pack(C:\Program Files\Git\mingw64\bin)能不能在cmd或powershell中使用。
因为OpenSSH默认的Login Shell是cmd
</p>
</div>
</div>
<div class="outline-3" id="outline-container-orgec87a3d">
<h3 id="orgec87a3d">Windows10 开启OpenSSH功能</h3>
<div class="outline-text-3" id="text-orgec87a3d">
<blockquote>
<p>
<a href="https://www.cnblogs.com/sparkdev/p/10166061.html">https://www.cnblogs.com/sparkdev/p/10166061.html</a>
</p>
</blockquote>
<p>
“设置”应用中，应用-可选功能-添加功能，里面安装OpenSSH服务器。
安装完成后，OpenSSH会作为一个Windows服务，在“服务管理器”中选择自启动或是手动，一定要在“服务管理器”中检查它的运行状态。
</p>
<p>
启动服务后在git bash中验证一下：
</p>
<p>
ssh &lt;windows-user&gt;@localhost
</p>
<p>
如果是本地账户，密码就是登录Windows时的密码；如果是微软联机账户，密码应该是微软账户密码，而不是PIN码。
</p>
<p>
然后需要配置ssh服务，与Linux上的配置类似的。配置允许Public Key登录，配置authorized_keys。
</p>
<p>
Windows上对应的目录如下：
</p>
<ul class="org-ul">
<li>/etc/ssh/sshd_config: C:\ProgramData\ssh</li>
<li>~/.ssh/authorized_keys: C:\Users\&lt;widnows user&gt;\.ssh</li>
</ul>
<p>
配置sshd_config需要注释掉最后的两行：
</p>
<pre class="example">
#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
</pre>
<p>
配置完成后注意在“服务管理器”中重启SSH服务
</p>
</div>
</div>
<div class="outline-3" id="outline-container-org6c04da2">
<h3 id="org6c04da2">Clone Windows上的仓库</h3>
<div class="outline-text-3" id="text-org6c04da2">
<blockquote>
<p>
<a href="https://stackoverflow.com/questions/53834304/how-do-i-git-clone-from-a-windows-machine-over-ssh">https://stackoverflow.com/questions/53834304/how-do-i-git-clone-from-a-windows-machine-over-ssh</a>
</p>
</blockquote>
<p>
在其他的linux主机上，下面这些命令都失败
</p>
<pre class="example">
git clone windows-git:/d/repo.git
git clone windows-git:D:\repo.git
git clone windows-git:D:\\repo.git
git clone windows-git:D:/repo.git
git clone windows-git:/D:/repo.git
git clone windows-git:'D:\repo.git'
</pre>
<p>
根据SO上的答案，应该和<a href="https://github.com/PowerShell/Win32-OpenSSH/issues/1082">windows cmd对引号的处理</a>有关。
</p>
</div>
<div class="outline-4" id="outline-container-org2b862f6">
<h4 id="org2b862f6">最简单的办法是<a href="https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration#configuring-the-default-shell-for-openssh-in-windows">把Windows上OpenSSH的Login Shell改成bash</a>，这样直接使用linux的路径格式。</h4>
</div>
<div class="outline-4" id="outline-container-org849cc90">
<h4 id="org849cc90">如果不改Login Shell，也有解决方法</h4>
<div class="outline-text-4" id="text-org849cc90">
<blockquote>
<p>
<a href="https://stackoverflow.com/questions/1092583/how-to-stop-git-via-ssh-on-windows-from-resolving-the-wrong-path/2323826#2323826">https://stackoverflow.com/questions/1092583/how-to-stop-git-via-ssh-on-windows-from-resolving-the-wrong-path/2323826#2323826</a>
</p>
</blockquote>
</div>
<ul class="org-ul">
<li><a id="org7cc8373"></a>Windows 服务器的Git Bash上执行<br/>
<div class="outline-text-5" id="text-org7cc8373">
<pre class="example">
echo 'git-receive-pack "$@"' &gt;grp.sh
echo 'git-upload-pack "$@"' &gt;gup.sh
</pre>
<p>
记住grp.sh gup.sh所在的目录
</p>
</div>
</li>
<li><a id="org6ad8d83"></a>Linux客户机上<br/>
<div class="outline-text-5" id="text-org6ad8d83">
<pre class="example">
git clone -u '"C:/Program Files/Git/bin/bash.exe" gup.sh' gdme1320@192.168.1.103:d/repo.git
# 如果报 gup.sh 找不到，则尝试用gup.sh的完整路径
git clone -u '"C:/Program Files/Git/bin/bash.exe" /usr/local/bin/gup.sh' gdme1320@192.168.1.103:/d/repo.git
# 进入到clone下来的仓库里面，配置.git/config，从而不必每次都加上-u那一长串参数。但从windows服务器上clone新的仓库时还是需要的，然后再进入新的仓库设置
cd repo
git config remote.origin.uploadpack '"C:\Program Files\Git\bin\bash.exe" gup.sh'
git config remote.origin.receivepack '"C:\Program Files\Git\bin\bash.exe" grp.sh'
</pre>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="date">Date: 2020-4-4</p>
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
